﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DECOR.DL.DALC;
using SAP.Middleware.Connector;
using DECOR.BL.BE;
using CM.DL.DALC.NC03;
using CM.BL.BE;

namespace DECOR.DL.DALC.NC03
{
    public class UsuarioDALC : IUsuarioDALC
    {
        //RfcConfigParameters rfc = new RfcConfigParameters();
        private string _connId = string.Empty;

        public static UsuarioDALC Instance(string pConnId)
        {
            if (_instance == null)
            {
                lock (typeof(UsuarioDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new UsuarioDALC(pConnId);
                    }
                }
            }
            return _instance;
        }

        private UsuarioDALC(string pConnId) { this._connId = pConnId; }
        private UsuarioDALC() { }
        private static volatile UsuarioDALC _instance = null;
       
        #region IUsuarioDALC Members

        public List<UsuarioBE> listar()
        {
            throw new NotImplementedException();
        }

        public List<UsuarioBE> buscarXNombre(string pNombre)
        {
            throw new NotImplementedException();
        }

        public List<UsuarioBE> buscarXUsuarioSAP(int pUsuarioSAP_id)
        {
            throw new NotImplementedException();
        }

        public List<UsuarioBE> buscarXCorreo(string pCorreo)
        {
            throw new NotImplementedException();
        }

        public UsuarioBE leer(int pUsuario_id)
        {
            throw new NotImplementedException();
        }

        public UsuarioBE leer(string pUsuario)
        {
            throw new NotImplementedException();
        }

        public void agregar(UsuarioBE objUsuario)
        {
            throw new NotImplementedException();
        }

        public bool login(UsuarioBE objUsuario)
        {
            throw new NotImplementedException();
        }

        public void eliminar(int pUsuario_id)
        {
            throw new NotImplementedException();
        }

        public bool actualizar(UsuarioBE objUsuario)
        {
            throw new NotImplementedException();
        }

        public List<UsuarioBE> listar(UsuarioBE pObjUsuarioWeb)
        {
            throw new NotImplementedException();
        }

        string IUsuarioDALC.login(ref RfcConfigParametersBE pObjUsuarioWebBE)
        {
            RfcConfigParameters rfcConfP;// = new RfcConfigParameters();
            //RfcConfigParametersBE objConn = new RfcConfigParametersBE();
            DestConfig dc = new DestConfig();
            RfcDestination dest;
            IRfcFunction function = null;
            string retval = string.Empty;
            string Username = "", Password = "";
            try
            {
                rfcConfP = DALC.getConfigParam(pObjUsuarioWebBE);
                
                try { RfcDestinationManager.RegisterDestinationConfiguration(dc); }
                catch {
                    
                }
                CredencialesController.Usuario = pObjUsuarioWebBE;
                dc.AddOrEditDestination(rfcConfP);                
                dest = RfcDestinationManager.GetDestination(CredencialesController.Usuario.Id);
                //dest = RfcDestinationManager.GetDestination(objConn.Id);
                dest.Ping();
                //--cargar repositorio:
                //function = dest.Repository.CreateFunction("ZCM_SD_001");//información del usuario
                //function = dest.Repository.CreateFunction("ZCM_SD_002");//cambio de contraseña
                //function = dest.Repository.CreateFunction("ZWEB_DATA_DDL");//parámetros
                //function = dest.Repository.CreateFunction("ZWEB_OPCIONES_USUARIO");//opciones de menú
                //function = dest.Repository.CreateFunction("ZWEB_BUSCA_MATERIALES");//búsqueda de materiales
                //function = dest.Repository.CreateFunction("ZWEB_DATA_LOTES");//stock detallado
                //function = dest.Repository.CreateFunction("ZWEB_BUSCA_STOCK_EC");//stock en curso
                //--obtener info de usuario:
                function = dest.Repository.CreateFunction("ZCM_SD_001");
                function.Invoke(dest);
                pObjUsuarioWebBE.PerNr = function.GetString("E_PERNR");
                pObjUsuarioWebBE.OrgVentas = function.GetString("E_VKORG");
                pObjUsuarioWebBE.CanalDist = function.GetString("E_VTWEG");
                pObjUsuarioWebBE.GrpVend = function.GetString("E_VKGRP");
                pObjUsuarioWebBE.OfVentas = function.GetString("E_VKBUR");
                pObjUsuarioWebBE.Descripcion = function.GetString("E_CNAME");
                pObjUsuarioWebBE.ClienteEvent = function.GetString("E_KUNNR");
                pObjUsuarioWebBE.pwdStatus = function.GetString("E_PWDST");
                pObjUsuarioWebBE.Email = function.GetString("E_EMAIL");
                pObjUsuarioWebBE.E_NAME1 = function.GetString("E_NAME1");
            }
           //catch(RfcInvalidStateException ex){
           //     string err = ex.Message;
           //     dc.AddOrEditDestination(rfcConfP);
           // }
            catch (Exception ex)
            {
                dc.RemoveDestination(pObjUsuarioWebBE.Id);
                retval = ex.Message;
            }
            finally
            {
                RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }

            return retval;
        }

        public string actualizar(RfcConfigParametersBE pObjUsuarioWebBE)
        {
            string retval = string.Empty;
            DestConfig dc = new DestConfig();
            RfcDestination dest;
            IRfcFunction function = null;
            try
            {
                dest = DALC.getDestination(out dc);
                function = dest.Repository.CreateFunction("ZCM_SD_002");
                function.SetValue("USERNAME", pObjUsuarioWebBE.Uname);
                function.SetValue("PASSWORD", pObjUsuarioWebBE.Passwd);
                function.Invoke(dest);
                IRfcStructure E_RETVAL = function.GetStructure("E_RETVAL");
                retval = E_RETVAL.GetString("TYPE") + "-" + E_RETVAL.GetString("MESSAGE");
            }
            catch (Exception ex)
            {
                retval = ex.Message;
            }
            finally
            {
                //RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }
            return retval;
        }

        public List<string> ObtenerOpcionesPorUsuario()
        {
            IRfcFunction function = null; RfcDestination dest = null;
            //InMemoryDestinationConfiguration dc = new InMemoryDestinationConfiguration();
            List<string> lstOpciones = new List<string>();
            string opc = "";
            DestConfig dc = new DestConfig();
            try
            {
                //try
                //{
                //    RfcDestinationManager.RegisterDestinationConfiguration(dc);
                //}
                //catch { }
                //RfcDestination dest = RfcDestinationManager.GetDestination(this._connId);
                dest = DALC.getDestination(out dc);
                function = dest.Repository.CreateFunction("ZWEB_OPCIONES_USUARIO");
                function.Invoke(dest);

                IRfcTable TOPCIONES = function.GetTable("PE_TOPCIONES");

                foreach (IRfcStructure item in TOPCIONES)
                {
                    opc = "";
                    opc = item[0].GetString();
                    lstOpciones.Add(opc);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                //RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }
            return lstOpciones;
        }

        #endregion

        #region IUsuarioDALC Members


        #endregion
        
        public string logout(string id)
        {
            string retval = string.Empty;
            DestConfig dc = new DestConfig();
            //InMemoryDestinationConfiguration dc = new InMemoryDestinationConfiguration();
            try
            {
                try
                {
                    RfcDestinationManager.RegisterDestinationConfiguration(dc);
                }
                catch { }
                try//fix para la ejecución en la pantalla inicio cuando aún no se han logeado.
                {
                    RfcDestination dest = RfcDestinationManager.GetDestination(id);
                    dest.Repository.ClearAllMetadata();
                    dest.Parameters.Clear();
                }
                catch { }
                dc.RemoveDestination(id);
            }
            catch (Exception ex)
            {
                retval = ex.Message;
            }
            finally
            {
                RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }
            return retval;
        }
    }
}
